//
// Created by 王小平 on 2024/7/19.
//
#include "iostream"

using namespace std;

/**
 * 定义无符号整型
 * 注意：
 * 1.一般的整数计算，全部用int
 * 2.如果数值超过了int的表示范围，用long long
 * 3.确定数值不可能为负，用无符号类型（比如统计人数，销售额等）
 */
void unsignedInt() {
    //无符号整型 0 ~ 4,294,967,295
    //数值类型都会存在负数，如果需要控制值为正数 使用 unsigned 定义
    //定义正整数
    //类似java中的 Integer 包装类，避免数值过大造成溢出，从而提升存储长度。
    unsigned int intV = 100;
    cout << "正整数 intV：" << intV << endl;
    cout << "正整数 intV 长度：" << sizeof intV << endl;
    cout << "" << endl;
}

/**
 * 定义有符号整型
 */
void signedInt() {
    //有符号整型 -32768 ~ 32767
    signed int intV = -100;
    cout << "负整数 intV：" << intV << endl;
    cout << "负整数 intV 长度：" << sizeof intV << endl;

    cout << "" << endl;
}


/**
 * 定义布尔类型
 */
void boolVal() {
    //    类型名称 最小长度
    //定义 布尔  未定义
    bool boolVal = true;
    cout << "布尔 boolVal：" << boolVal << endl;
    cout << "布尔 boolVal 长度：" << sizeof boolVal << endl;
    cout << "" << endl;
}

/**
 * 定义字符类型
 */
void charVal() {
    //定义 字符     8位
    char charVal = 'A';
    cout << "字符 charVal：" << charVal << endl;
    cout << "字符 charVal 长度：" << sizeof charVal << endl;
    //每个字符都对应一个数值，可以通过类型相互转换
    //整数 -》 字符
    char cVal1 = 65;
    cout << "65: " << cVal1 << endl;
    char cVal2 = cVal1 + 1;
    cout << "cVal1 + 1: " << cVal2 << endl;
    cout << "" << endl;
}

/**
 * 短整型
 */
void shortVal() {
    //定义 短整型    16位
    short shortVal = 200;
    cout << "短整型 shortVal：" << shortVal << endl;
    cout << "短整型 shortVal 长度：" << sizeof shortVal << endl;
    cout << "" << endl;
}

/**
 * 定义整型
 */
void intVal() {
    //定义 整型     16位
    int intVal = 20;
    cout << "整型 a：" << intVal << endl;
    cout << "整型 a 长度：" << sizeof intVal << endl;
    cout << "" << endl;
}

/**
 * 定义长整型
 */
void longVal() {
    //定义 长整型     32位
    long longVal = 2000;
    cout << "长整型 longVal：" << longVal << endl;
    cout << "长整型 longVal 长度：" << sizeof longVal << endl;
    cout << "" << endl;
}

/**
 * 定义长长整型
 */
void longLongVal() {
    //定义 长长整型     64位
    long long longLongVal = 2000000;
    cout << "长长整型 longLongVal：" << longLongVal << endl;
    cout << "长长整型 longLongVal 长度：" << sizeof longLongVal << endl;

    cout << "" << endl;
}

/**
 * 定义单精度
 */
void floatVal() {
    //定义 float 32位  4字节
    float floatVal = 3.14;
    cout << "单精度 floatVal:" << floatVal << endl;
    cout << "单精度 floatVal 长度:" << sizeof floatVal << endl;

    cout << "" << endl;
}

/**
 * 定义双精度
 */
void doubleVal() {
    //定义 double 64位  8字节
    double doubleVal = 3.14555555;
    cout << "双精度 doubleVal:" << doubleVal << endl;
    cout << "双精度 doubleVal 长度:" << sizeof doubleVal << endl;

    cout << "" << endl;
}

/**
 * 定义长双精度
 */
void longDoubleVal() {
    //定义 long double  12～16字节
    long double longDoubleVal = 3.14555555666666666665;
    cout << "长双精度 doubleVal:" << longDoubleVal << endl;
    cout << "长双精度 doubleVal 长度:" << sizeof longDoubleVal << endl;

    cout << "" << endl;
}

/**
 * 定义字面值常量
 */
void autoVal() {
    //定义字面值常量
    /**
     * 注意：
     * 一般在定义整型字面值时，会给它加上一个后缀，明确告诉计算机值是什么类型
     * 1 默认什么都不加，是int类型
     * 2 l 或者 L 表示long类型
     * 3 ll 或者 LL 表示long long类型
     * 4 u 或者 U 表示unsigned无符号类型
     * 一般会用大写L，避免跟数字1混淆；而u可以和L或LL组合使用。
     * 例如：9257uLL 表示这个数是 unsigned long long 类型
     */
    //如下为两种方式定义：
    //整型
    //十进制 整型常量
    const int i = 30;
    30;
    //八进制 整型常量
    const long i2 = 036L;
    036L;
    //十六进制 长长整型常量
    const long long i3 = 0x1ELL;
    0x1ELL;

    //浮点类型
    const float v4 = 1.34;
    1.34f;
    const double v5 = 6.5555;
    6.5555;
    const long double v6 = 666.6666;
    666.6666L;

    //字符类型
    const char v7 = 'A';
    'A';
    '1';
    ',';

    //字符串类型
    const string v8 = "你好呀";
    "你好呀";

    //转义符号
    //换行
    "\n";
    //单引号
    '\'';
    //双引号
    "\"";
    //空格
    "\t";
    //反斜线
    "\\";
    //问号
    "\?";

    //布尔类型
    const bool v9 = true;
    true;

    cout << "" << endl;
}

/**
 * 启动入口函数
 * @return 是否启动成功
 */
int main() {

    boolVal();
    charVal();
    shortVal();
    intVal();
    unsignedInt();
    signedInt();
    longVal();
    longLongVal();
    floatVal();
    doubleVal();
    longDoubleVal();
    autoVal();

    return 0;
}

